home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / tools / post2_g2 / src / p_disp.c < prev    next >
Text File  |  1997-10-13  |  9KB  |  444 lines

  1. /*
  2.     post / 郵便番号検索プログラム
  3.  
  4.     p_disp.c / 表示部
  5. */
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <ctype.h>
  11. #include <sys/dos.h>
  12. #include <mbstring.h>
  13. #include "post.h"
  14.  
  15.  
  16. /*
  17.     番号の表示
  18. */
  19. void
  20. disp_number()
  21. {
  22.     uchar    read_wk,    /* ファイル読みワーク */
  23.         get_wk[256],
  24.         knum[8],    /* 旧番号 */
  25.         kenmei[10],    /* 県名 */
  26.         *get_wk_p;
  27.  
  28.     int    disp_kensuu = 0,    /* 表示件数 */
  29.         i1 = 0,            /* ループ汎用 */
  30.         loop_sw = 1;        /* ループスイッチ */
  31.  
  32.     int    point[1024],        /* 字名の ofs 位置 */
  33.         gen_page = 1,        /* 今いるページ数 */
  34.         zen_page = 1,        /* 全ページ数 */
  35.         lpcnt = 1,        /* 表示行 */
  36.         ki = 0,            /* 表示行(ループ用) */
  37.         lp = 1,            /* ループ用 */
  38.         ofs_wk = 0,        /* オフセット保存用 */
  39.         kijun = 0;        /* 表示基準値 */
  40.  
  41.     uchar    numbuff[64],
  42.         page_azamei[PAGELINE][512],    /* ページ用字名ワーク */
  43.         page_yomi3[PAGELINE][512],    /* ページ用字名読みワーク */
  44.         pknum[PAGELINE][8],        /* ページ用旧番号ワーク */
  45.         pnum[PAGELINE][12];        /* ページ用郵便番号ワーク */
  46.  
  47.     struct _inpptr    inpp;
  48.  
  49.  
  50.     /* 解析結果の表示 */
  51.     strcpy( kenmei, pref[num_pref] );
  52.     keta( kenmei, yomi0 );
  53.     keta( shikumei, yomi1 );
  54.     keta( shikumei2, yomi2 );
  55.  
  56.     /* 読みがなの表示 */
  57.     printf("\t   ");
  58.     kugiri();
  59.     printf("%s", yomi0 );
  60.     kugiri();
  61.     if( shikumei[0] != '\0' ) {
  62.         printf("%s", yomi1 );
  63.         kugiri();
  64.     }
  65.     if( shikumei2[0] != '\0' ) {
  66.         printf("%s", yomi2 );
  67.         kugiri();
  68.     }
  69.     printf("\n");
  70.  
  71.     /* 地名の表示 */
  72.     printf("解析結果 : ");
  73.     kugiri();
  74.     printf("%s", kenmei );
  75.     kugiri();
  76.     if( shikumei[0] != '\0' ) {
  77.         printf("%s", shikumei );
  78.         kugiri();
  79.     }
  80.     if( shikumei2[0] != '\0' ) {
  81.         printf("%s", shikumei2 );
  82.         kugiri();
  83.     }
  84.     printf("\n\n");
  85.  
  86.     get_wk[ 0 ] = '\0';
  87.     get_wk_p = get_wk;
  88.  
  89.     if( buf[ofs] == '*' ) {    /* いきなり番号なら */
  90.  
  91.         ofs++;
  92.         get_next_num( get_wk_p );    /* 番号を得る */
  93.         number_seikei( get_wk_p );
  94.         ofs++;
  95.         get_next_num( knum );        /* 旧番号も */
  96.  
  97.         if( buf[ofs] != '%' ) {    /* 字名がない=一円 */
  98.  
  99.             printf("%s%s", pref[num_pref], shikumei );
  100.             if( shikumei2[ 0 ] != '\0' ) {    /* 市区名2で表示が異なる */
  101.                 printf("%s",shikumei2 );
  102.             }
  103.  
  104.             printf("内の郵便番号はすべて %s ", get_wk );
  105.             if( !k_suppress ) {
  106.                 k_num_disp( knum );
  107.                 printf(" ");
  108.             }
  109.             printf("です。\n");
  110.             return;
  111.  
  112.         } else {            /* 「以下に……」 */
  113.  
  114.             printf("%s\t: 以下に掲載がない場合\n",get_wk );
  115.         }
  116.     }
  117.  
  118.     disp_kensuu = 0;
  119.     while( loop_sw ) {
  120.  
  121.         read_wk = buf[ ofs++ ];
  122.  
  123.         get_wk[ 0 ] = '\0';
  124.         get_wk_p = get_wk;
  125.  
  126.         switch( read_wk ) {
  127.  
  128.             case '%':    /* 町名字名 */
  129.  
  130.                 ofs_wk = ofs;
  131.                 get_next_han( get_wk_p );    /* 字名を得る */
  132.                 get_next_han2( yomi3 );        /* 字名の読みを得る */
  133.  
  134.                 if( input_str[0] == '\0' ||    /* 入力文がヌルか、 */
  135.                     sentou_niji( get_wk ) ) {    /* 先頭2字が一致 */
  136.  
  137.                     point[disp_kensuu] = ofs_wk;
  138.                     disp_kensuu++;
  139.                     pass_next_han();
  140.                     pass_next_han();
  141.  
  142.                 } else {
  143.                     pass_next_han();
  144.                     pass_next_han();    /* 次の半角までパス */
  145.                 }
  146.  
  147.  
  148.                 break;
  149.  
  150.             case '+':    /* 読み */
  151.  
  152.                 puts("異常 202 : 読みを検出した");
  153.                 break;
  154.  
  155.             case ' ':  /* 県 */
  156.             case '!':  /* 市 */
  157.             case '$':  /* 市内区 */
  158.             case '\"': /* 23区 */
  159.             case '#':  /* 郡 */
  160.             case ':':  /* 町 */
  161.             case ';':  /* 村 */
  162.  
  163.                 loop_sw = 0;    /* 処理終了 */
  164.  
  165.                 break;
  166.  
  167.             default:
  168.                 printf("read_wk=|%c|\n",read_wk);
  169. printf("shikumei=|%s|,shikumei2=|%s|\n",shikumei,shikumei2);
  170. printf("yomi0=|%s|,yomi1=|%s|,yomi2=|%s|,yomi3=|%s|\n",yomi0,yomi1,yomi2,yomi3);
  171.                 puts("異常 201 : データファイル post.dat が異常です。");
  172.                 exit( 1 );
  173.  
  174.                 break;
  175.         }
  176.  
  177.     } /* while終端 */
  178.  
  179.     if( disp_kensuu == 0 ) {    /* ヒット1件もなし */
  180.  
  181.         printf("\n警告 203 : 字名「%s」は検索できませんでした。\n", input_str );
  182.         printf("この字名は、通称であるか、入力間違いであるか、");
  183.         printf("元データの収録漏れの可能性があります。\n");
  184.         puts("読み検索などで再検索されることをお勧めします。");
  185.  
  186.     } else {    /* ヒットした */
  187.  
  188.         gen_page = 1;                /* 1ページ目から */
  189.         zen_page = disp_kensuu / PAGELINE + 1;    /* 24件ずつ表示 */
  190.         if( zen_page == 0 ) {
  191.             zen_page = 1;
  192.         }
  193.  
  194.         /* 桁揃え */
  195.         strcpy( kenmei, pref[num_pref] );
  196.         keta( kenmei, yomi0 );
  197.         keta( shikumei, yomi1 );
  198.         keta( shikumei2, yomi2 );
  199.  
  200.         loop_sw = 1;
  201.         do {
  202.             _dos_c_cls_al();
  203.  
  204.             status_print();
  205.             printf("該当件数 : %4d 件\t", disp_kensuu );
  206.             printf("ページ : %2d / %2d\n\n", gen_page, zen_page);
  207.  
  208.             printf("\t   ");
  209.  
  210.             kugiri();
  211.             printf("%s", yomi0 );
  212.             kugiri();
  213.             if( shikumei[0] != '\0' ) {
  214.                 printf("%s", yomi1 );
  215.                 kugiri();
  216.             }
  217.             if( shikumei2[0] != '\0' ) {
  218.                 printf("%s", yomi2 );
  219.                 kugiri();
  220.             }
  221.             printf("\n");
  222.  
  223.             printf("解析結果 : ");
  224.             kugiri();
  225.             printf("%s", kenmei );
  226.             kugiri();
  227.             if( shikumei[0] != '\0' ) {
  228.                 printf("%s", shikumei );
  229.                 kugiri();
  230.             }
  231.             if( shikumei2[0] != '\0' ) {
  232.                 printf("%s", shikumei2 );
  233.                 kugiri();
  234.             }
  235.             printf("\n\n");
  236.  
  237.             /* 基準値 */
  238.             kijun = (gen_page - 1) * PAGELINE;
  239.  
  240.             /* 実際に表示する件数 */
  241.             /* 1ページしかない、もしくは最終ページなら調整 */
  242.             if( gen_page == zen_page ) {
  243.                 if( zen_page >= 2 ) {
  244.                     lpcnt = disp_kensuu - ((zen_page-1)*PAGELINE);
  245.                 } else {
  246.                     lpcnt = disp_kensuu;
  247.                 }
  248.             } else {
  249.                 lpcnt = PAGELINE;
  250.             }
  251.  
  252.             /* 初期化 */
  253.             for( i1=0; i1<=PAGELINE-1; i1++ ) {
  254.                 page_azamei[i1][0]     = '\0';
  255.                 page_yomi3[i1][0]     = '\0';
  256.                 pnum[i1][0]         = '\0';
  257.             }
  258.  
  259.             /* データを取ってきて表示 */
  260.             for( i1=0; i1<=lpcnt-1; i1++ ) {
  261.  
  262.                 ki = kijun + i1;
  263.                 ofs = point[ ki ];
  264.  
  265.                 /* 字名を得る */
  266.                 get_next_han( page_azamei[i1] );
  267.  
  268.                 /* 50 字で打ち切り */
  269. /*
  270.                 if( strlen( page_azamei[i1] ) >= 50 ) {
  271.                     page_azamei[i1][50]='\0';
  272.                     strcat( page_azamei[i1], "〈略〉" );
  273.                 }
  274. */
  275.  
  276.                 get_next_han2( page_yomi3[i1] );    /* 読み */
  277.  
  278.                 ofs++;
  279.                 get_next_num( pnum[i1] );
  280.                 number_seikei( pnum[i1] );
  281.                 ofs++;
  282.                 get_next_num( pknum[i1] );
  283.  
  284.                 /* ここから表示 */
  285.                 printf("%4d : ", ki+1 );    /* 件数表示 */
  286.                 if( !k_suppress ) {
  287.                     k_num_disp( pknum[i1] );    /* 旧番号表示 */
  288.                 }
  289.                 printf("%s : ", pnum[i1] );    /* 新番号表示 */
  290.                 if( input_str[0] == '\0' ) {
  291.                     printf("%s", page_azamei[i1] );
  292.                 } else {
  293.                     moji_pr( page_azamei[i1], input_str );
  294.                 }
  295.                 printf("(%s)\n", page_yomi3[i1] );
  296.             }
  297.  
  298.             /* キー入力 */
  299.             puts("");
  300.             printf("字名限定:a 旧番号切替:k 区切:d 厳密検索:g\n");
  301.             if( gen_page != zen_page ) {
  302.                 printf("次ページ:n ");
  303.             }
  304.             if( gen_page != 1 ) {
  305.                 printf("前ページ:b ");
  306.             }
  307.             printf("次検索:p 終了:q or e\n");
  308.             inpp.max = 64;
  309.             inpp.length = 64;
  310.  
  311.             lp = 1;
  312.             do{
  313.                 fep_off();
  314. //                _dos_kflushgs( &inpp );
  315.                 _dos_gets( &inpp );
  316.                 strcpy( numbuff, inpp.buffer );
  317.  
  318.                 if( numbuff[0] == 'q' || numbuff[0] == 'Q' ||
  319.                     numbuff[0] == 'e' || numbuff[0] == 'E' ) {
  320.                     puts("");
  321.                     exit( 0 );
  322.  
  323.                 } else if( numbuff[0] == 'k' || numbuff[0] == 'K' ) {
  324.                     /* 旧番号モードトグル */
  325.                     if( k_suppress ) {
  326.                         k_suppress = 0;
  327.                     } else {
  328.                         k_suppress = 1;
  329.                     }
  330.                     lp = 0;
  331.  
  332.                 } else if( numbuff[0] == 'a' || numbuff[0] == 'A' ) {
  333.                     /* 字名モードトグル */
  334.                     if( azamei_gentei ) {
  335.                         azamei_gentei = 0;
  336.                     } else {
  337.                         azamei_gentei = 1;
  338.                     }
  339.                     lp = 0;
  340.  
  341.                 } else if( numbuff[0] == 'd' || numbuff[0] == 'D' ) {
  342.                     /* 区切りモードトグル */
  343.                     if( kugiri_mode ) {
  344.                         kugiri_mode = 0;
  345.                     } else {
  346.                         kugiri_mode = 1;
  347.                     }
  348.                     lp = 0;
  349.  
  350.                 } else if( numbuff[0] == 'g' || numbuff[0] == 'G' ) {
  351.                     /* 厳密モードトグル */
  352.                     if( genmitsu_mode ) {
  353.                         genmitsu_mode = 0;
  354.                     } else {
  355.                         genmitsu_mode = 1;
  356.                     }
  357.                     lp = 0;
  358.  
  359.                 } else if( numbuff[0] == 'p' || numbuff[0] == 'P' ) {
  360.  
  361.                     /* 次の検索へ */
  362.                     lp = 0;
  363.                     loop_sw = 0;
  364.                     break;
  365.  
  366.                 } else if( numbuff[0] == 'n' || numbuff[0] == 'N' ||
  367.                        numbuff[0] == '\0' ) {
  368.                     /* 次のページへ */
  369.                     if( gen_page != zen_page ) {
  370.                         gen_page++;
  371.                         lp = 0;
  372.                         break;
  373.                     }
  374.                 } else if( numbuff[0] == 'b' || numbuff[0] == 'B' ) {
  375.                     /* 前のページへ */
  376.                     if( gen_page != 1 ) {
  377.                         gen_page--;
  378.                         lp = 0;
  379.                         break;
  380.                     }
  381.                 }
  382.  
  383.                 /* 漢字かカナが入力された? */
  384.                 if( ismbblead( numbuff[0] ) ||        /* 1文字はダメよ */
  385.                   ( ismbbkana( numbuff[0] ) && strlen( numbuff ) >= 2 ) ) {
  386.                     dokuji_sw = 1;
  387.                     exist_moji = 1;
  388.                     strcpy( input_str, numbuff );
  389.                     return;
  390.                 }
  391.  
  392.                 /* 郵便番号か? */
  393.                 if( is_bangou_legal( numbuff ) ) {    /* 番号なら */
  394.                     dokuji_sw = 1;
  395.                     exist_moji = 1;
  396.                     strcpy( input_str, numbuff );    /* 番号として検索 */
  397.                     return;
  398.                 }
  399.  
  400.             } while ( lp );
  401.         } while( loop_sw );
  402.     }
  403.  
  404.     return;
  405. }
  406.  
  407.  
  408. /*
  409.     旧番号表示
  410.  
  411.     もらった文字列をフォームして表示
  412.  
  413.     3桁:   (nnn)
  414.     5桁:(nnn-nn)
  415. */
  416. void
  417. k_num_disp( uchar *kstr )
  418. {
  419.     int    kl,    /* 長さ */
  420.         i1;    /* ループ汎用 */
  421.  
  422.  
  423.     kl = strlen( kstr );
  424.  
  425.     if( kl == 3 ) {        /* 3桁である */
  426.  
  427.         printf("   (%s)", kstr );
  428.  
  429.     } else {        /* 5桁である */
  430.  
  431.         printf("(");
  432.         for( i1=0; i1<=2; i1++ ) {
  433.             printf("%c", kstr[i1] );
  434.         }
  435.         printf("-");
  436.         for( i1=3; i1<=4; i1++ ) {
  437.             printf("%c", kstr[i1] );
  438.         }
  439.         printf(")");
  440.     }
  441.  
  442.     return;
  443. }
  444.